//
//  PGHomeTableViewController.swift
//  PGWeibo
//
//  Created by Apple on 15/11/3.
//  Copyright © 2015年 Apple. All rights reserved.
//

import UIKit
import SVProgressHUD

let statusNormalReuseCellId = "statusNormalReuseCellId"
let statusReweetReuseCellId = "statusReweetReuseCellId"
class PGHomeTableViewController: PGVisitorTableViewController {
    /// 数据列表
    private lazy var listViewModel = PGStatusListViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !userLogon  {
            visitorView?.setupVisitorInfo(nil, description: nil)
            return
        }
        
        
        prepareTableView()
        loadData()
        
    }
    
    private func prepareTableView() {
        //注册cell
        print(tableView)
        tableView.registerClass(PGReweetStatusCell.self, forCellReuseIdentifier: statusReweetReuseCellId)
        tableView.registerClass(PGNormalStatusCell.self, forCellReuseIdentifier: statusNormalReuseCellId)

        tableView.estimatedRowHeight = 400
        tableView.separatorStyle = .None
        refreshControl = UIRefreshControl()
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)
    }
    
    @objc private func loadData() {
        listViewModel.loadStatusList { (isSuccessed: Bool) -> () in
            //当数据加载完成 停止刷新
            self.refreshControl?.endRefreshing()
            if !isSuccessed {
                SVProgressHUD.showInfoWithStatus("数据错误,请稍后再试")
                return
            }
            print(self.listViewModel.statusViewModelList)
            
            self.tableView.reloadData()
        }
    }
}
// MARK: - delegate
extension PGHomeTableViewController {
    /**
     行高
     
     -- 设置了预估行高
     * 当前显示的行高方法会调用三次（每个版本的Xcode调用次数可能不同）
     
     问题：预估行高如果不同，计算的次数不同！
     
     1. 使用预估行高，计算出预估的 contentSize
     2. 根据预估行高，判断计算次数，顺序计算每一行的行高，更新 contentSize
     3. 如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新 contentSize
     4. 使用预估行高，每个 cell 的显示前需要计算，单个 cell 的效率是低的，从整体效率高！
     
     执行顺序 行数 -> 每个[cell -> 行高]
     
     预估行高：尽量靠近！
     
     -- 没设置了预估行高
     * 1. 计算所有行的高度
     * 2. 再计算显示行的高度
     
     执行顺序 行数 -> 行高 -> cell
     
     问题：为什么要调用所有行高方法？UITableView 继承自 UIScrollView
     表格视图滚动非常流畅 -> 需要提前计算出 contentSize
     
     苹果官方文档有指出，如果行高是固定值，就不要实现行高代理方法！
     
     实际开发中，行高一定要缓存！
     */
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            //缓存行高
        return listViewModel.statusViewModelList[indexPath.row].rowHeight
    }
}

// MARK: - dataSources
extension PGHomeTableViewController {
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusViewModelList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let vm = listViewModel.statusViewModelList[indexPath.row]
        let cell = tableView.dequeueReusableCellWithIdentifier(vm.statusCellReuseId, forIndexPath: indexPath) as! PGStatusCell
        
        let viewModel = vm
        cell.viewModel = viewModel
        return cell
    }
}